package world;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Issue implements Comparable<Issue> {

    private long id;
    private List<Message> messages;
    private Set<Author> authors;

    public Issue() {
        this.messages = new ArrayList<Message>();
        this.authors = new HashSet<Author>();
    }

    //insere a mensagem na lista de mensagens da issue
    public void insertMessage(Message msg) {
        this.messages.add(msg);
    }
    //insere o autor na lista de autores da issue

    public void insertAuthor(Author author) {
        this.authors.add(author);
    }

    // verifica se a issue contem um determinado autor
    public boolean containsAuthor(Author author) {
        return this.authors.contains(author);
    }

    //retorna uma String com todos os tokens de todas as mensagens da issue 
    public String getTokens() {
        StringBuilder tokens = new StringBuilder();
        for (int i = 0; i < this.messages.size(); i++) {
            tokens.append(this.messages.get(i).getTokens());
            if (i < this.messages.size() - 1) {
                tokens.append(",");
            }
        }
        return tokens.toString();
    }
    //retorna uma Lista com todos os tokens de todas as mensagens da issue 

    public List<String> getTokensList() {
        Set<String> tokensSet = new HashSet<String>();
        for (int i = 0; i < this.messages.size(); i++) {
            String tokens = this.messages.get(i).getTokens();
            if (tokens != null) {
                tokensSet.addAll(Arrays.asList(tokens.split(" ")));
            }
        }
        return Arrays.asList(tokensSet.toArray(new String[0]));
    }

    public List<String> getTokensLessAuthorList(Author author) {
        Set<String> tokensSet = new HashSet<String>();
        for (int i = 0; i < this.messages.size(); i++) {
            if (!this.messages.get(i).getAutor().equals(author)) {
                String tokens = this.messages.get(i).getTokens();
                if (tokens != null) {
                    tokensSet.addAll(Arrays.asList(tokens.split(" ")));
                }
            }
        }
        return Arrays.asList(tokensSet.toArray(new String[0]));
    }

    // dado o mundo retorna o vetor de incidência de 0 e 1 da issue
    public boolean[] getVector(List<String> world) {
        boolean[] vector = new boolean[world.size()];
        List<String> tokens = this.getTokensList();
        for (int i = 0; i < tokens.size(); i++) {
            int posicao = Collections.binarySearch(world, tokens.get(i));
            // como o mundo foi restringido por data podem haver tokens aqui
            // que nao existem no mundo
            if (posicao >= 0) {
                vector[posicao] = true;
            }
        }
        //String vectorString = Arrays.toString(vector).replaceAll("[\\[|\\]]", "");
        return vector;
    }
    // dado o mundo retorna o vetor de incidência de 0 e 1 da issue

    public boolean[] getVectorLessAuthor(List<String> world, Author author) {
        boolean[] vector = new boolean[world.size()];
        List<String> tokens = this.getTokensLessAuthorList(author);
        for (int i = 0; i < tokens.size(); i++) {
            int posicao = Collections.binarySearch(world, tokens.get(i));
            // como o mundo foi restringido por data podem haver tokens aqui
            // que nao existem no mundo
            if (posicao >= 0) {
                vector[posicao] = true;
            }
        }
        //String vectorString = Arrays.toString(vector).replaceAll("[\\[|\\]]", "");
        return vector;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Override
    public int compareTo(Issue other) {
        if (this.id > other.getId()) {
            return 1;
        } else if (this.id > other.getId()) {
            return -1;
        }
        return 0;
    }
}
